﻿using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web.Http;
using TccServicos.Models;
using TccServicos.Util;

namespace TccServicos.Controllers
{
    public class CidadeController : ApiController
    {
        #region Atributos
        private string sThread = "";
        #endregion

        #region WebApis do TCC Cidade
        [HttpPost]
        public RetornoServico SaveCidade(Cidade objeto)
        {
            sThread = Util.Util.NextHex(4);
            string nomeFuncao = string.Format("{0} [{1}]", "SaveCidade", sThread);

            try
            {
                if (!Validacao.ObjetoValido(objeto))
                {
                    Log.GravarLog(string.Format("{0}: {1}", nomeFuncao, Validacao.objetoInvalido));
                }

                string jsonEntrada = JsonConvert.SerializeObject(objeto, new JsonSerializerSettings()
                {
                    NullValueHandling = NullValueHandling.Ignore
                });

                Log.GravarLog(string.Format("{0}: {1}", nomeFuncao, jsonEntrada));

                using (adoteEntities contexto = new adoteEntities())
                {
                    contexto.CADASTRO_CIDADE.Add(new CADASTRO_CIDADE
                    {
                        ID_UF = objeto.uf.idUf,
                        CIDADE = objeto.cidade,
                    });
                    contexto.SaveChanges();
                    Log.GravarLog(string.Format("{0}: {1}", nomeFuncao, Validacao.salvoComSucesso));
                    return Util.Util.RetornoOk();
                }
            }
            catch (Exception ex)
            {
                Log.GravarLog(string.Format("{0} Erro: {1}", nomeFuncao, ex.ToString()));
                return Util.Util.RetornoErro(ex.ToString());
            }
        }

        [HttpGet]
        public RetornoCidade GetCidade([FromUri] int? idCidade = null, [FromUri] string cidade = null)
        {
            sThread = Util.Util.NextHex(4);
            string nomeFuncao = string.Format("{0} [{1}]", "GetCidade", sThread);

            try
            {
                Log.GravarLog(string.Format("{0}: id={1}", nomeFuncao, idCidade.HasValue ? idCidade.Value.ToString() : "0"));

                using (adoteEntities contexto = new adoteEntities())
                {
                    var consulta = (from t in contexto.CADASTRO_CIDADE.AsNoTracking()
                                    join uf in contexto.CADASTRO_UF.AsNoTracking() on t.ID_UF equals uf.ID_UF
                                    select new Cidade
                                    {
                                        idCidade = t.ID_CIDADE,
                                        cidade = t.CIDADE,
                                        uf = new Uf()
                                        {
                                            idUf = uf.ID_UF,
                                            uf = uf.UF,
                                        }
                                    });
                    if (idCidade.HasValue)
                        consulta = consulta.Where(x => x.idCidade.Equals(idCidade.Value));
                    if (!string.IsNullOrEmpty(cidade))
                        consulta = consulta.Where(x => x.cidade.Contains(cidade));
                    consulta = consulta.OrderBy(x => x.cidade);

                    var retorno = consulta.ToList();

                    Log.GravarLog(string.Format("{0}: {1}", nomeFuncao, Validacao.consultaComSucesso));

                    return new RetornoCidade() { lista = retorno };
                }
            }
            catch (Exception ex)
            {
                Log.GravarLog(string.Format("{0} Erro: {1}", nomeFuncao, ex.ToString()));
                return default(RetornoCidade);
            }
        }
        #endregion

    }
}
